<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>递归实现深拷贝</title>
</head>
<body>

<a href="https://www.bilibili.com/video/BV1Y84y1L7Nn/?p=190&spm_id_from=pageDriver&vd_source=cb928a955f1123af004a2e3158113ea7">
    视频讲解
</a>

<script>
    // 定义2个对象
    const 对象 = {
        姓名: 'pink',
        年龄: 18,
        爱好: ['乒乓球', '足球'],
        家庭成员: {
            小孩: '小pink'
        }
    }

    const 副本对象 = {} // 先设置空对象, 下面'对象'复制给'副本对象'

    // -------- 递归实现深拷贝 (这里介绍的是 简版)--------
    function 对象_深拷贝(新对象, 旧对象) {
        for (let Key in 旧对象) {
            // 处理数组的问题  一定先写数组 在写 对象 不能颠倒 (因为数组也看作对象)
            if (旧对象[Key] instanceof Array) {
                // 先判断是不是数组, 如果是先对数组就行 依次赋值
                新对象[Key] = [] // 因为是要遍历赋值的是数组, 先定义一个空数组
                // 递归方法 进行遍历
                //  新对象[Key], 接收 []空数组, '爱好'
                //  旧对象[Key], ['乒乓球', '足球']
                对象_深拷贝(新对象[Key], 旧对象[Key]) // 参数是新数组 和 旧数组
            } else if (旧对象[Key] instanceof Object) {
                // 先判断是不是对象, 如果是对对象就行 依次赋值
                新对象[Key] = {} // 先定义一个空数组
                // 递归方法 进行遍历
                //  新对象[Key], 接收 {}空数组
                //  旧对象[Key]
                对象_深拷贝(新对象[Key], 旧对象[Key]) // 参数是新对象 和 旧对象
            } else {
                // Key, 属性名   旧对象[Key], 属性值
                新对象[Key] = 旧对象[Key] // 遍历的属性和值,依次给 '新对象'赋值
            }
        }
    }

    // 函数调用
    对象_深拷贝(副本对象, 对象)

    副本对象.姓名 = 'aaa'
    副本对象.家庭成员.小孩 = 'dddddddd'
    console.log(副本对象)
    console.log(对象)
</script>


</body>
</html>